package router

import (
	"github.com/gin-gonic/gin"
	"go-gin-api/core/config"
	"go-gin-api/core/log"
	"go-gin-api/core/middleware"
)

var (
	routerNoCheckRole = make([]func(*gin.RouterGroup), 0)
	routerCheckRole   = make([]func(v2 *gin.RouterGroup, authMiddleware gin.HandlerFunc), 0)
)

// func InitRouter() *gin.Engine { // 也可以func InitRouter() *gin.Engine 返回一个*gin.Engine,在main里面调用

func InitRouter() {
	// 入参
	gin.SetMode(config.GetString("app.model")) // 运行模式。生产 release /开发 debug 环境。
	//r := gin.Default() // 路由初始化。都可以，Default() 默认加了两个中间件，日志和？？
	r := gin.Default()     // 路由初始化。都可以，没有Default() 默认加的日志等两个中间件
	r.Use(log.GinLogger()) // 引进自定义日志中间件
	//r.Use(gin.Recovery()) gin自带的处理异常
	r.Use(log.GinRecovery(true)) // gin.Default()本来默认有的中间件，因为自定义了gin.New(),所以补上。Recovery 中间件会恢复任何恐慌(panics) 如果存在恐慌，中间件将会写入500。

	// 无需认证的路由
	examplesNoCheckRoleRouter(r)
	// 需要认证的路由
	examplesCheckRoleRouter(r, middleware.JwtMiddleware())

	r.Run(config.GetString("app.port")) // 跑起来。也可以func InitRouter() *gin.Engine 返回一个*gin.Engine,在main里面调用
	//return
}

// 无需认证的路由示例
func examplesNoCheckRoleRouter(r *gin.Engine) {
	// 可根据业务需求来设置接口版本
	v3 := r.Group("/api/v1")
	for _, f := range routerNoCheckRole {
		f(v3)
	}
}

// 需要认证的路由示例
func examplesCheckRoleRouter(r *gin.Engine, authMiddleware gin.HandlerFunc) {
	// 可根据业务需求来设置接口版本
	v3 := r.Group("/api/v1")
	for _, f := range routerCheckRole {
		f(v3, authMiddleware)
	}
}
